import logging

from PySide6.QtCore import Qt, Signal
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QGraphicsLinearLayout, QPushButton, QGraphicsProxyWidget, QMenu, QSizePolicy

from 程序核心代码.mvvm重构.基础定义.基础图形项.基础图形组件 import 容器初始化时是否隐藏
from 程序核心代码.mvvm重构.基础定义.基础图形项.基础图形组件.子组件.基础文本组件 import 基础文本组件, 对齐方式
from 程序核心代码.mvvm重构.基础定义.节点管理器.容器节点图形项管理器 import 容器节点图形项管理器
from .容器图形项 import 容器组件基础图形项
from .带组件带布局的节点图形项 import 带组件带布局的节点图形项

logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

class 带容器带组件带布局的节点图形项(带组件带布局的节点图形项):
    #节点可见改变信号 = Signal(bool)
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        #print("创建带容器带组件带布局的节点图形项")
        super().__init__(节点模型,父容器节点图形项管理器, 父项)
        self.父项 = 父项
        #print("创建带容器带组件带布局的节点图形项")
        self.设置属性("节点可见",False)
        self.容器图形项 = None
        self.当前鼠标位置 = None
        #起始接口.能否手动调整大小 = True
        self.调试模式 = False  # 新增调试模式开关
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志

        日志记录器.info("创建带容器带组件带布局的节点图形项")
        self.容器内节点图形项管理 = 容器节点图形项管理器(父级节点模型=节点模型)
        self.是否隐藏容器 = 容器初始化时是否隐藏
        #self.容器内节点图形项管理.容器内节点图形项准备就绪信号.connect(self.容器内节点图形项准备就绪)

        #起始接口.初始容器图形项()
        self.初始化容器图形项管理器()
        日志记录器.info("创建容器图形项成功")
        #self.注册属性变动触发函数("节点可见", self.节点可见性改变)
        #self.节点可见改变信号.connect(self.节点可见性改变)
    # def 节点可见性改变(self, 是否可见):
    #     if 是否可见:
    #         self.容器内节点图形项管理.设置属性触发函数("节点可见", 是否可见)
    #         #print("容器内节点图形项管理状态机名称:",self.容器内节点图形项管理.状态机名称)
    def 加载容器区组件(self):
        if self.调试模式:
            日志记录器.info("创建容器图形项")
        self.容器名称组件 = 基础文本组件(self.获取属性("容器状态") or "未能获取容器状态")
        self.注册属性变动触发函数("容器状态", self.容器名称组件.设置文本)
        self.容器名称组件.设置文本对齐方式(对齐方式.居中对齐)

        self.创建名称最小化最大化按钮()
        self.容器标题栏布局.addItem(self.容器名称组件)
        self.容器标题栏布局.addItem(self.名称最小化最大化按钮)  # 将按钮添加到横向布局中

        self.容器名称组件.设置容器大小策略(QSizePolicy.MinimumExpanding, QSizePolicy.Minimum)
        self.容器名称组件.setMaximumHeight(self.容器名称组件.文本图形项.boundingRect().size().height())



    def 初始化容器图形项管理器(self):
        if self.容器图形项:
            self.是否隐藏容器 = False
            self.scene().removeItem(self.容器图形项)

        self.容器区布局.removeItem(self.容器图形项)
        self.容器图形项 = 容器组件基础图形项(0, 0, 1000, 1000, self)
        self.容器内节点图形项管理.容器 = self.容器图形项
        self.更新容器显示状态()

    def 更新容器显示状态(self):
        日志记录器.debug("更新容器显示状态: 是否隐藏容器: %s", self.是否隐藏容器)
        if self.是否隐藏容器:
            self.大小按钮.setText("显示")
            self.容器图形项.setVisible(False)
        else:
            self.大小按钮.setText("隐藏")
            self.容器图形项.setVisible(True)

    # def 容器内节点图形项准备就绪(self):
    #     日志记录器.info("容器内节点图形项准备就绪")
    #     self.大小按钮.setEnabled(True)

    def 创建名称最小化最大化按钮(self):
        """创建最小化/最大化按钮，并连接其点击事件"""
        self.大小按钮 = QPushButton()
        self.名称最小化最大化按钮 = QGraphicsProxyWidget()  # 使用 QGraphicsProxyWidget 包装按钮
        self.大小按钮.clicked.connect(self.按钮调整容器显示)  # 连接按钮的点击事件
        self.名称最小化最大化按钮.setWidget(self.大小按钮)  # 使用 QGraphicsProxyWidget 包装 QPushButton
        #self.大小按钮.setEnabled(False)  # 设置为不可点击
    def 按钮调整容器显示(self):
        """实现最小化/最大化按钮的功能"""
        if self.容器图形项.isVisible():
            #print("容器隐藏前节点大小：", 起始接口.boundingRect())
            self.容器图形项.setVisible(False)
            #print("容器隐藏")  # 隐藏容器
            self.容器区布局.removeItem(self.容器图形项)
            self.容器内节点图形项管理.设置属性("容器被显示", False)
            self.大小按钮.setText("显示")  # 更新按钮文本
            self.设置节点大小(self.默认节点大小)
           # self.容器内节点图形项管理.容器内容隐藏()
        else:
            self.默认节点大小 = self.boundingRect().size()
            if self.容器内节点图形项管理.获取属性值("节点图形项已生成"):
                #self.容器内节点图形项管理.需要显示图形项 = True
                self.容器内节点图形项管理.设置属性触发函数("容器被显示", True)
                #self.容器内节点图形项管理.容器内容显示()
            self.容器区布局.addItem(self.容器图形项)
            self.容器图形项.setVisible(True)
            #起始接口.节点定义.容器节点模型管理器.自动布局()
            self.大小按钮.setText("隐藏")  # 更新按钮文本

    def contextMenuEvent(self, 事件):
        """右键菜单事件处理方法。"""
        菜单 = QMenu()  # 创建菜单
        添加节点 = QAction("添加节点")  # 创建添加节点动作
        添加节点.triggered.connect(self.添加节点动作)  # 连接添加节点的槽函数
        菜单.addAction(添加节点)  # 将添加节点动作添加到菜单
        self.当前鼠标位置 = 事件.scenePos()
        日志记录器.debug("右键菜单在位置: %s", self.当前鼠标位置)
        菜单.exec(事件.screenPos())  # 在鼠标位置执行菜单

    def 添加节点动作(self):
        日志记录器.info("添加节点动作被触发")
        pass
    def 初始化容器区(self):
        #日志记录器.debug("初始化容器区")
        self.容器区布局 = QGraphicsLinearLayout(Qt.Vertical)  # 容器区为垂直线性布局
        self.容器区布局.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)
        #起始接口.容器区布局.setMinimumSize(0, 0)
        self.容器标题栏布局 = QGraphicsLinearLayout(Qt.Horizontal)  # 容器区标题栏为水平线性布局
        self.容器标题栏布局.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
        self.容器区布局.addItem(self.容器标题栏布局)
        self.容器区布局.setStretchFactor(self.容器标题栏布局, 0)
        #起始接口.主体布局.addItem(起始接口.容器区布局)